from pydantic import BaseModel, Field, validator
from typing import Optional

class TranslateRequest(BaseModel):
    """
    翻译请求模型
    定义翻译接口的请求参数结构和验证规则
    """
    
    # 原始文本（必填）
    text: str = Field(..., description="需要翻译的文本", min_length=1, max_length=10000)
    
    # 目标语言（必填）
    target_language: str = Field(..., description="目标语言代码", min_length=2, max_length=10)
    
    # 源语言（可选，默认自动检测）
    source_language: str = Field(default="auto", description="源语言代码，默认为auto（自动检测）")
    
    # Shopify店铺域名（必填）
    shopify_domain: str = Field(..., description="Shopify店铺域名", min_length=3, max_length=255)
    
    # 元数据模块（可选）
    metadata_model: str = Field(default="", description="元数据模块", max_length=255)
    
    @validator('target_language')
    def validate_target_language(cls, v):
        """
        验证目标语言不为auto
        """
        if v.lower() == "auto":
            raise ValueError("目标语言不能为auto")
        return v.strip().lower()
    
    @validator('source_language')
    def validate_source_language(cls, v):
        """
        验证源语言格式
        """
        return v.strip().lower()
    
    @validator('shopify_domain')
    def validate_shopify_domain(cls, v):
        """
        验证Shopify域名格式
        """
        if not v.strip():
            raise ValueError("Shopify域名不能为空")
        # 移除可能的https://前缀和/trailing斜杠
        cleaned = v.strip()
        if cleaned.startswith(('http://', 'https://')):
            cleaned = cleaned.split('://', 1)[1]
        if cleaned.endswith('/'):
            cleaned = cleaned[:-1]
        return cleaned
    
    @validator('text')
    def validate_text_not_empty(cls, v):
        """
        验证文本不为空字符串
        """
        if not v.strip():
            raise ValueError("翻译文本不能为空")
        return v.strip()


class TranslateProductToMetafieldRequest(BaseModel):
    """
    产品翻译到Metafield请求模型
    定义translate-product-to-metafield接口的JSON请求体结构
    """
    
    # Shopify店铺域名（必填）
    shopify_domain: str = Field(..., description="Shopify店铺域名", min_length=3, max_length=100)
    
    # 产品ID（必填）
    product_id: int = Field(..., description="产品ID", gt=0)
    
    # Metafield命名空间（可选）
    namespace: Optional[str] = Field(None, description="Metafield命名空间，默认translate_namespace")
    
    # Metafield键名（必填）
    key: str = Field(..., description="Metafield键名，标识翻译内容类型")
    
    # 需要翻译的原始文本（必填）
    ori_text: str = Field(..., description="需要翻译的原始文本", min_length=1, max_length=5000)
    
    # 目标语言代码（必填）
    target_language: str = Field(..., description="目标语言代码，如en, fr, de等", min_length=2, max_length=10)
    
    # Metafield类型（可选，默认single_line_text_field）
    type: str = Field(default="single_line_text_field", description="Metafield类型")
    
    @validator('shopify_domain')
    def validate_shopify_domain(cls, v):
        """
        验证Shopify域名格式
        """
        if not v.strip() or '.' not in v:
            raise ValueError("Shopify域名格式无效，必须包含点号")
        # 移除可能的https://前缀和/trailing斜杠
        cleaned = v.strip()
        if cleaned.startswith(('http://', 'https://')):
            cleaned = cleaned.split('://', 1)[1]
        if cleaned.endswith('/'):
            cleaned = cleaned[:-1]
        return cleaned
    
    @validator('target_language')
    def validate_target_language(cls, v):
        """
        验证目标语言格式
        """
        return v.strip().lower()
    
    @validator('ori_text')
    def validate_ori_text_not_empty(cls, v):
        """
        验证原始文本不为空字符串
        """
        if not v.strip():
            raise ValueError("原始文本不能为空")
        return v.strip()